package com.wyix;

import com.wyix.entity.Book;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author wangdx
 * @since 2025/8/5
 */
public class ComprehensiveStreamExample {
    public static void main(String[] args) {
        List<Book> books = Arrays.asList(
                new Book("Java编程思想", "Bruce Eckel", Arrays.asList("编程", "Java"), 128.0, 2007),
                new Book("Clean Code", "Robert C. Martin", Arrays.asList("编程", "方法论"), 99.0, 2008),
                new Book("数据结构与算法", "严蔚敏", Arrays.asList("计算机科学", "算法"), 89.9, 2012),
                new Book("Java并发编程实战", "Brian Goetz", Arrays.asList("编程", "Java", "并发"), 139.0, 2006),
                new Book("Effective Java", "Joshua Bloch", Arrays.asList("编程", "Java"), 128.0, 2017),
                new Book("Java 8 程序设计", "Wangsheng", Arrays.asList("编程", "Java"), 138.0, 2015),
                new Book("设计模式", "Erich Gamma", Arrays.asList("编程", "设计模式"), 118.0, 1994),
                new Book("Python基础教程", "Magnus Lie Hetland", Arrays.asList("编程", "Python"), 79.9, 2016)
        );

        // 1. 过滤：2010年后出版的Java书籍
        List<Book> newJavaBooks = books.stream()
                .filter(b -> b.getPublishYear() > 2010 && b.getCategories().contains("Java"))
                .collect(Collectors.toList());
//        List<Book> newJavaBooks = books.stream()
//                .filter(b -> b.getPublishYear() > 2010)
//                .filter(b -> b.getCategories().contains("Java"))
//                .collect(Collectors.toList());
        System.out.println("-----2010年后出版的Java书籍-------");
        newJavaBooks.forEach(System.out::println);

        // 2. 映射：提取所有书籍的书名列表（map）
        List<String> bookTitles = books.stream()
                .map(Book::getTitle)
                .collect(Collectors.toList());
        System.out.println("-----提取所有书籍的书名列表（map）------");
        System.out.println("2. 所有书名：" + bookTitles);

        // 3. 扁平化映射：提取所有分类（flatMap）
        Set<String> allCategories = books.stream()
                .flatMap(b -> b.getCategories().stream())
                .collect(Collectors.toSet());
        System.out.println("3. 所有分类：" + allCategories);

        // 4. 排序：按价格降序排列（sorted）
        List<Book> sortedByPrice = books.stream()
                .sorted(Comparator.comparingDouble(Book::getPrice).reversed())
                .collect(Collectors.toList());
        System.out.println("4. 按价格降序：" + sortedByPrice);

        // 5. 匹配：是否存在价格超过130的书籍（anyMatch）
        boolean hasExpensiveBook = books.stream()
                .anyMatch(b -> b.getPrice() > 130);
        System.out.println("5. 存在超130元书籍：" + hasExpensiveBook);


        // 6. 归约：计算所有书籍总价格（reduce）
        double totalPrice = books.stream()
                .mapToDouble(Book::getPrice)
                .reduce(0, Double::sum);
        System.out.printf("6. 总价格：%.2f元\n", totalPrice);

        // 7. 分组：按作者分组（groupingBy）
        Map<String, List<Book>> authorGroup = books.stream()
                .collect(Collectors.groupingBy(Book::getAuthor));
        System.out.println("7. 按作者分组：" + authorGroup);

        // 8. 分区：价格是否超过100元（partitioningBy）
        Map<Boolean, List<Book>> pricePartition = books.stream()
                .collect(Collectors.partitioningBy(b -> b.getPrice() > 100));
        System.out.println("8. 价格分区（>100元）：" + pricePartition.get(true));

        // 9. 统计：价格统计信息（summarizingDouble）
        DoubleSummaryStatistics priceStats = books.stream()
                .collect(Collectors.summarizingDouble(Book::getPrice));
        System.out.printf("9. 价格统计：平均=%.2f，最高=%.2f，最低=%.2f\n",
                priceStats.getAverage(), priceStats.getMax(), priceStats.getMin());

        // 10. 连接字符串：所有书名用逗号连接（joining）
        String titleStr = books.stream()
                .map(Book::getTitle)
                .collect(Collectors.joining(", "));
        System.out.println("10. 书名连接：" + titleStr);

        // 11. 限制与跳过：取前3本价格最高的书籍（limit/skip）
        List<Book> top3Expensive = books.stream()
                .sorted(Comparator.comparingDouble(Book::getPrice).reversed())
                .limit(3)
                .collect(Collectors.toList());
        System.out.println("11. 前三贵书籍：" + top3Expensive);

        // 12. 调试查看：使用peek查看中间处理过程
        List<Book> discountedBooks = books.stream()
                .peek(b -> System.out.println("处理前：" + b))
                .map(b -> new Book(b.getTitle(), b.getAuthor(), b.getCategories(), b.getPrice() * 0.9, b.getPublishYear()))
                .peek(b -> System.out.println("处理后（9折）：" + b))
                .collect(Collectors.toList());
        System.out.println("12. 9折后的书籍列表：" + discountedBooks);

    }
}
